﻿#define _CRT_SECURE_NO_WARNINGS 1


//#include"HashTable.h"
//#include<string>
//
//void test1()
//{
//	yyh::HashTable<int, int> hash;
//	int arr[] = { 19,30,5,36,13,20,21,12 };
//	for (auto& e : arr)
//	{
//		hash.Insert({ e, e });
//	}
//
//	cout << hash.Find(30) << endl;
//	cout << hash.Find(300) << endl;
//
//	for (int i = 0; i < 50; i++)
//	{
//		hash.Insert({ rand(), 1 });
//	}
//
//	hash.Erase(30);
//	cout << hash.Find(30) << endl;
//	cout << hash.Find(300) << endl;
//}
//
//void test2()
//{
//	yyh::HashTable<double, int> hash;
//	hash.Insert({ 3.14, 1 });
//	hash.Insert({ 5.20, 1 });
//	hash.Insert({ 13.14, 1 });
//	hash.Insert({ 3.15, 1 });
//
//	cout << hash.Find(3.15) << endl;
//	cout << hash.Find(3.151) << endl;
//}
//
//int main()
//{
//	yyh::HashTable<string, string> hash;
//	hash.Insert({ "left", "左边" });
//	hash.Insert({ "right", "右边" });
//	hash.Insert({ "up", "上边" });
//	hash.Insert({ "low", "下边" });
//
//	cout << hash.Find("up") << endl;
//	cout << hash.Find("upp") << endl;
//
//	return 0;
//}

//#include"HashTable.h"
//
//void test1()
//{
//	yyh::HashTable<int, int> hash;
//	int arr[] = { 19,30,5,36,13,20,21,12,24,96,58,111 };
//	for (auto& e : arr)
//	{
//		hash.Insert({ e, e });
//	}
//
//	cout << hash.Find(30) << endl;
//	cout << hash.Find(300) << endl;
//
//	for (int i = 0; i < 50; i++)
//	{
//		hash.Insert({ rand(), 1 });
//	}
//
//	hash.Erase(30);
//	cout << hash.Find(30) << endl;
//	cout << hash.Find(300) << endl;
//}
//
//void test2()
//{
//	yyh::HashTable<double, int> hash;
//	hash.Insert({ 3.14, 1 });
//	hash.Insert({ 5.20, 1 });
//	hash.Insert({ 13.14, 1 });
//	hash.Insert({ 3.15, 1 });
//
//	cout << hash.Find(3.15) << endl;
//	cout << hash.Find(3.151) << endl;
//}
//
//int main()
//{
//	yyh::HashTable<string, string> hash;
//	hash.Insert({ "left", "左边" });
//	hash.Insert({ "right", "右边" });
//	hash.Insert({ "up", "上边" });
//	hash.Insert({ "low", "下边" });
//
//	cout << hash.Find("up") << endl;
//	cout << hash.Find("upp") << endl;
//
//	return 0;
//}


//#include<string>
//#include<iostream>
//
//using namespace std;
//
//struct Person
//{
//	string name;
//	int age;
//};
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5 };
//	Person p[] = { {"张三", 18}, {"李四", 19}, {"王五", 20} };
//
//	return 0;
//}


//#include<vector>
//#include<iostream>
//
//using namespace std;
//
//class Date
//{
//public:
//	Date(int year = 2025, int month = 1, int day = 1)
//		:_year(year)
//		,_month(month)
//		,_day(day)
//	{
//		cout << "Date(int year, int month, int day)" << endl;
//	}
//
//	Date(const Date& d)
//		:_year(d._year)
//		,_month(d._month)
//		,_day(d._day)
//	{
//		cout << "Date(const Date& d)" << endl;
//	}
//
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	Date d1 = { 2025, 7, 23 };
//	Date d2{ 2025, 7, 23 };
//
//	vector<Date> v;
//	v.push_back(d1);
//	v.push_back({ 2025, 7, 23 });
//
//	return 0;
//}


//#include<vector>
//#include<iostream>
//
//using namespace std;
//
//int main()
//{
//	initializer_list<int> list1 = { 10,20,30 };
//	cout << list1.begin() << endl;
//	cout << list1.end() << endl;
//
//	vector<int> v1 = { 1,2,3,4,5 };
//	for (auto& e : v1)
//	{
//		cout << e << ' ';
//	}
//	cout << endl;
//
//	// 也支持赋值
//	vector<int> v2;
//	v2 = { 1,2,3,4,5 };
//	for (auto& e : v1)
//	{
//		cout << e << ' ';
//	}
//	cout << endl;
//
//	return 0;
//}


//#include<string>
//#include<iostream>
//
//using namespace std;
//
//int main()
//{
//	// 常见的左值
//	int* p = new int(0);
//	int b = 1;
//	const int c = b;
//	*p = 10;
//	string s("111111");
//	s[0] = 'x';
//
//	cout << &c << endl;
//	cout << (void*)&s[0] << endl;// cout是流输出，想要输出地址的话需要强转一下
//
//	int x = 1, y = 2;
//
//	10;
//	x + y;
//	max(1, 2);
//	string("111111");
//
//	//cout << &10 << endl;
//	//cout << &(x+y) << endl;
//	//cout << &(max(x, y)) << endl;
//	//cout << &string("11111") << endl;
//
//	return 0;
//}


#include<string>
#include<iostream>

using namespace std;

int main()
{
	int* p = new int(0);
	int b = 1;
	*p = 10;
	string s("111111");
	s[0] = 'x';

	// 左值引⽤给左值取别名
	int& r1 = b;
	int*& r2 = p;
	int& r3 = *p;
	string& r4 = s;
	char& r5 = s[0];

	int x = 1, y = 2;
	10;
	x + y;
	max(1, 2);
	string("11111");

	// 右值引⽤给右值取别名
	int&& rr1 = 10;
	double&& rr2 = x + y;
	double&& rr3 = max(x, y);
	string&& rr4 = string("11111");

	// 左值引⽤不能直接引⽤右值，但是const左值引⽤可以引⽤右值
	const int& rx1 = 10;
	const double& rx2 = x + y;
	const double& rx3 = max(x, y);
	const string& rx4 = string("11111");

	// 右值引⽤不能直接引⽤左值，但是右值引⽤可以引⽤move(左值)
	int&& rrx1 = move(b);
	int*&& rrx2 = move(p);
	int&& rrx3 = move(*p);
	string&& rrx4 = move(s);

	// b、r1、rr1都是变量表达式，都是左值
	cout << &b << endl;
	cout << &r1 << endl;
	cout << &rr1 << endl;

	// 这⾥要注意的是，rr1的属性是左值，所以不能再被右值引⽤绑定，除⾮move⼀下
	int& r6 = r1;
	//int&& rrx6 = rr1;
	int&& rrx6 = move(rr1);
	
	return 0;
}